/**
 * @ProjectName: AlipayChannel
 * @Title: XmlUtil.java
 * @Package com.jiankangjin.AlipayChannel.util
 * @Description: 
 * Copyright: Copyright (c) 2014 
 * Company:
 * @author liuzy
 * @date 2014年7月25日 上午10:42:56
 * @version V1.0   
 */ 
package com.jiankangjin.alipaychannel.util;

import java.util.Iterator;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import com.jiankangjin.alipaychannel.vo.PayXmlBean;
import com.jiankangjin.alipaychannel.vo.QueryXmlBean;


public class XmlUtil {
	
	private static final transient Log log = LogFactory.getLog(XmlUtil.class);
	
	/**
	 * 把支付下单（还有取消交易）的xml响应解析为java对象
	 * @param xml
	 * @return
	 */
	public static PayXmlBean parseCreateAndPayVo(String xml) {
		PayXmlBean obj = new PayXmlBean();
		Document doc;
		try {
			doc = DocumentHelper.parseText(xml);
			Element root = doc.getRootElement();

			walk(root.elementIterator(), obj);

		} catch (DocumentException e1) {
			log.error(e1, e1);
		}
		return obj;
	}
	
	
	/**
	 * 把查询单笔交易的xml响应解析为java对象
	 * @param xml
	 * @return
	 */
	public static QueryXmlBean parseQueryVo(String xml) {
		QueryXmlBean obj = new QueryXmlBean();
		Document doc;
		try {
			doc = DocumentHelper.parseText(xml);
			Element root = doc.getRootElement();

			walk(root.elementIterator(), obj);

		} catch (DocumentException e1) {
			log.error(e1, e1);
		}
		return obj;
	}
	
	static void walk(Iterator<?> i, PayXmlBean obj) {
		while(i.hasNext()) {
	        Element e = (Element) i.next();
	        if ("is_success".equals(e.getName())) {
	        	if ("T".equals(e.getText())) {
	        		obj.setSuccess(true);
	        	} else {
	        		obj.setSuccess(false);
	        	}		        	
	        } else if ("error".equals(e.getName())) {
	        	obj.setError(e.getText());
	        } else if ("buyer_logon_id".equals(e.getName())) {
	        	obj.setBuyerLogonId(e.getText());
	        } else if ("buyer_user_id".equals(e.getName())) {
	        	obj.setBuyerUserId(e.getText());
	        } else if ("detail_error_code".equals(e.getName())) {
	        	obj.setDetailErrorCode(e.getText());
	        } else if ("detail_error_des".equals(e.getName())) {
	        	obj.setDetailErrorDes(e.getText());
	        } else if ("out_trade_no".equals(e.getName())) {
	        	obj.setOutTradeNo(e.getText());
	        } else if ("result_code".equals(e.getName())) {
	        	obj.setResultCode(e.getText());
	        } else if ("trade_no".equals(e.getName())) {
	        	obj.setTradeNo(e.getText());
	        } else if ("param".equals(e.getName())) {
	        	if ("sign".equals(e.attribute("name").getText())) {
					//System.out.println("sign:"+e.getText());
				} else if ("_input_charset".equals(e.attribute("name").getText())) {
					//System.out.println("_input_charset:"+e.getText());
				} else if ("subject".equals(e.attribute("name").getText())) {
					//System.out.println("subject:"+e.getText());
				} else if ("sign_type".equals(e.attribute("name").getText())) {
					//System.out.println("sign_type:"+e.getText());
				} else if ("service".equals(e.attribute("name").getText())) {
					//System.out.println("service:"+e.getText());
				} else if ("notify_url".equals(e.attribute("name").getText())) {
					//System.out.println("notify_url:"+e.getText());
				} else if ("partner".equals(e.attribute("name").getText())) {
					//System.out.println("partner:"+e.getText());
				} else if ("notify_url".equals(e.attribute("name").getText())) {
					//System.out.println("notify_url:"+e.getText());
				} else if ("out_trade_no".equals(e.attribute("name").getText())) {
					obj.setOutTradeNo(e.getText());
				}
	        }
	        walk(e.elementIterator(), obj);
	     }
	}
	
	static void walk(Iterator<?> i, QueryXmlBean obj) {
		while(i.hasNext()) {
	        Element e = (Element) i.next();
	        if ("is_success".equals(e.getName())) {
	        	if ("T".equals(e.getText())) {
	        		obj.setSuccess(true);
	        	} else {
	        		obj.setSuccess(false);
	        	}		        	
	        } else if ("buyer_email".equals(e.getName())) {//买家支付宝账号
	        	obj.setBuyerEmail(e.getText());
	        } else if ("buyer_id".equals(e.getName())) {//买家支付宝账号对应的支付宝唯一用户号
	        	obj.setBuyerId(e.getText());
	        } else if ("is_total_fee_adjust".equals(e.getName())) {//交易金额是否调整过
	        	obj.setIsTotalFeeAdjust(e.getText());
	        } else if ("out_trade_no".equals(e.getName())) {//商户网站唯一订单号
	        	obj.setOutTradeNo(e.getText());
	        } else if ("trade_no".equals(e.getName())) {//支付宝交易号
	        	obj.setTradeNo(e.getText());
	        } else if ("subject".equals(e.getName())) {//商品名称
	        	obj.setSubject(e.getText());
	        } else if ("body".equals(e.getName())) {//商品描述
	        	obj.setBody(e.getText());
	        } else if ("price".equals(e.getName())) {//商品单价
	        	obj.setPrice(e.getText());
	        } else if ("quantity".equals(e.getName())) {//购买数量
	        	obj.setQuantity(e.getText());
	        } else if ("logistics_fee".equals(e.getName())) {//邮费
	        	obj.setLogisticsFee(e.getText());
	        } else if ("coupon_discount".equals(e.getName())) {//红包折扣
	        	obj.setCouponDiscount(e.getText());
	        } else if ("total_fee".equals(e.getName())) {//交易总金额
	        	obj.setTotalFee(e.getText());
	        } else if ("use_coupon".equals(e.getName())) {//是否使用过红包
	        	obj.setUseCoupon(e.getText());
	        } else if ("seller_email".equals(e.getName())) {//卖家的支付宝账号
	        	obj.setSellerEmail(e.getText());
	        } else if ("seller_id".equals(e.getName())) {//卖家支付宝账号对应的支付宝唯一用户号
	        	obj.setSellerId(e.getText());
	        } else if ("discount".equals(e.getName())) {//折扣
	        	obj.setDiscount(e.getText());
	        } else if ("flag_trade_locked".equals(e.getName())) {//交易冻结状态
	        	obj.setFlagTradeLocked(e.getText());
	        } else if ("refund_status".equals(e.getName())) {//退款状态
	        	obj.setRefundStatus(e.getText());
	        } else if ("logistics_status".equals(e.getName())) {//物流状态
	        	obj.setLogisticsStatus(e.getText());
	        } else if ("additional_trade_status".equals(e.getName())) {//交易附加状态
	        	obj.setAdditionalTradeStatus(e.getText());
	        } else if ("trade_status".equals(e.getName())) {//交易状态
	        	obj.setTradeStatus(e.getText());
	        } else if ("gmt_create".equals(e.getName())) {//交易创建时间
	        	obj.setGmtCreate(e.getText());
	        } else if ("gmt_last_modified_time".equals(e.getName())) {//交易最近一次修改时间
	        	obj.setGmtLastModifiedTime(e.getText());
	        } else if ("gmt_payment".equals(e.getName())) {//付款时间
	        	obj.setGmtPayment(e.getText());
	        } else if ("gmt_send_goods".equals(e.getName())) {//卖家发货时间
	        	obj.setGmtSendGoods(e.getText());
	        } else if ("gmt_refund".equals(e.getName())) {//退款时间
	        	obj.setGmtRefund(e.getText());
	        } else if ("time_out".equals(e.getName())) {//主超时时间
	        	obj.setTimeOut(e.getText());
	        } else if ("gmt_close".equals(e.getName())) {//交易关闭时间
	        	obj.setGmtClose(e.getText());
	        } else if ("gmt_logistics_modify".equals(e.getName())) {//物流状态更新时间
	        	obj.setGmtLogisticsModify(e.getText());
	        } else if ("time_out_type".equals(e.getName())) {//主超时间类型
	        	obj.setTimeOutType(e.getText());
	        } else if ("refund_fee".equals(e.getName())) {//退款金额
	        	obj.setRefundFee(e.getText());
	        } else if ("refund_flow_type".equals(e.getName())) {//退款流程
	        	obj.setRefundFlowType(e.getText());
	        } else if ("refund_id".equals(e.getName())) {//退款ID
	        	obj.setRefundId(e.getText());
	        } else if ("refund_cash_fee".equals(e.getName())) {//退现金金额
	        	obj.setRefundCashFee(e.getText());
	        } else if ("refund_coupon_fee".equals(e.getName())) {//退红包金额
	        	obj.setRefundCouponFee(e.getText());
	        } else if ("refund_agent_pay_fee".equals(e.getName())) {//退积分金额
	        	obj.setRefundAgentPayFee(e.getText());
	        } else if ("coupon_used_fee".equals(e.getName())) {//使用红包的金额
	        	obj.setCouponUsedFee(e.getText());
	        } else if ("to_buyer_fee".equals(e.getName())) {//累计的已经退款金额
	        	obj.setToBuyerFee(e.getText());
	        } else if ("to_seller_fee".equals(e.getName())) {//累计的已打款给买家的金额
	        	obj.setToSellerFee(e.getText());
	        } else if ("fund_bill_list".equals(e.getName())) {//资金单据列表
	        	obj.setFundBillList(e.getText());
	        } else if ("payment_type".equals(e.getName())) {//收款类型
	        	obj.setPaymentType(e.getText());
	        }	        
	        walk(e.elementIterator(), obj);
	     }
	}
}
